﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Follow.Utils;
using Follow.Model;
using System.Data.SqlClient;
using System.Transactions;

namespace Follow.DataAccess
{
    public class FuncionalidadeDAO
    {
        private SqlDataReader reader = null;
        private SqlConnection conn = null;
        private SqlCommand cmd = null;

        public FuncionalidadeDAO()
        {
            conn = ConnectionUtils.getConnection();
        }

        public IList<Funcionalidade> findAll()
        {
            IList<Funcionalidade> Funcionalidade = new List<Funcionalidade>();

            try
            {
                conn.Open();

                String sqlCommand = " select * from funcionalidade order by descricao";
                cmd = new SqlCommand(sqlCommand, conn);
                reader = cmd.ExecuteReader();

                while (reader.Read())
                {
                    Funcionalidade func = new Funcionalidade();
                    func.IDFuncionalidade = reader.GetInt32(0);
                    func.Descricao = reader.GetString(1);
                    func.Url = reader.GetString(2);

                    Funcionalidade.Add(func);
                }
            }

            finally
            {
                if (reader != null)
                {
                    reader.Dispose();
                    reader.Close();
                }

                if (conn != null)
                {
                    conn.Dispose();
                    conn.Close();
                }
            }

            return Funcionalidade;
        }

        public void insert(Funcionalidade funcionalidade, Int32 idlogin)
        {
            try
            {
                conn.Open();
                String sqlCommand = " insert into funcionalidade (descricao, url) values (@descricao, @url);";
                cmd = new SqlCommand(sqlCommand, conn);
                cmd.Parameters.Add(new SqlParameter("descricao", funcionalidade.Descricao));
                cmd.Parameters.Add(new SqlParameter("url", funcionalidade.Url));

                cmd.ExecuteNonQuery();
            }
            finally
            {
                if (reader != null)
                {
                    reader.Dispose();
                    reader.Close();
                }

                if (conn != null)
                {
                    conn.Dispose();
                    conn.Close();
                }
            }
            LogDAO log = new LogDAO();
            log.insert(idlogin, Common.SQLStringSingleton.GetCommandText(cmd), "Insert", "Funcionalidade");
        }


        public void delete(Int32 id, Int32 idlogin)
        {
            using (var transaction = new TransactionScope())
            {
                try
                {
                    conn.Open();
                    String sqlCommand = " delete from funcionalidade where idfuncionalidade = @id;";
                    cmd = new SqlCommand(sqlCommand, conn);
                    cmd.Parameters.Add(new SqlParameter("id", id));
                    cmd.ExecuteNonQuery();
                    transaction.Complete();

                }
                catch (Exception)
                {
                    transaction.Dispose();
                    throw;
                }
                finally
                {
                    if (reader != null)
                    {
                        reader.Close();
                    }

                    if (conn != null)
                    {
                        conn.Close();
                    }
                }
                LogDAO log = new LogDAO();
                log.insert(idlogin, Common.SQLStringSingleton.GetCommandText(cmd), "Delete", "Funcionalidade");
            }
        }
        public void update(Funcionalidade funcionalidade, Int32 idlogin)
        {
            try
            {
                conn.Open();
                String sqlCommand = " update funcionalidade set descricao = @descricao," +
                                    " url = @url where idfuncionalidade = @id;";
                cmd = new SqlCommand(sqlCommand, conn);
                cmd.Parameters.Add(new SqlParameter("descricao", funcionalidade.Descricao));
                cmd.Parameters.Add(new SqlParameter("url", funcionalidade.Url));
                cmd.Parameters.Add(new SqlParameter("id", funcionalidade.IDFuncionalidade));
                cmd.ExecuteNonQuery();

            }
            finally
            {
                if (reader != null)
                {
                    reader.Close();
                }
                if (conn != null)
                {
                    conn.Close();
                }
            }
            LogDAO log = new LogDAO();
            log.insert(idlogin, Common.SQLStringSingleton.GetCommandText(cmd), "Inserir", "Funcionalidade");
        }
        public Funcionalidade findByID(Int32 id)
        {
            Funcionalidade funcionalidades = null;
            try
            {
                conn.Open();
                String sqlCommand = " select * from funcionalidade where idfuncionalidade = " + id + "order by descricao";
                cmd = new SqlCommand(sqlCommand, conn);
                reader = cmd.ExecuteReader();

                if (reader.Read())
                {
                    funcionalidades = new Funcionalidade();
                    funcionalidades.IDFuncionalidade = reader.GetInt32(0);
                    funcionalidades.Descricao = reader.GetString(1);
                    funcionalidades.Url = reader.GetString(2);
                }

            }
            finally
            {
                if (reader != null)
                {
                    reader.Close();
                }
                if (conn != null)
                {
                    conn.Close();
                }
            }
            return funcionalidades;
        }

        public IList<Funcionalidade> findByUsuario(int id)
        {
            IList<Funcionalidade> funcionalidades = new List<Funcionalidade>();
            try
            {
                conn.Open();
                String sqlCommand = " select * from funcionalidade f " +
                                    " inner join grupo_funcionalidade gf on gf.funcionalidade_idfuncionalidade = f.idfuncionalidade" +
                                    " inner join usuario u on u.grupo_idgrupo = gf.grupo_idgrupo " +
                                    " where u.idusuario = @id";
                cmd = new SqlCommand(sqlCommand, conn);
                cmd.Parameters.Add(new SqlParameter("id", id));
                reader = cmd.ExecuteReader();

                while (reader.Read())
                {
                    Funcionalidade f = new Funcionalidade();
                    f.IDFuncionalidade = reader.GetInt32(0);
                    f.Descricao = reader.GetString(1);
                    f.Url = reader.GetString(2);
                    funcionalidades.Add(f);
                }
            }
            finally
            {
                if (reader != null)
                {
                    reader.Close();
                }

                if (conn != null)
                {
                    conn.Close();
                }
            }
            return funcionalidades;
        }

        public IList<Funcionalidade> findByDescricao(String descricao)
        {
            IList<Funcionalidade> f = new List<Funcionalidade>();

            try
            {
                conn.Open();

                String sqlCommand = " select * from funcionalidade where descricao like '%" + descricao +"%' order by descricao ";
                cmd = new SqlCommand(sqlCommand, conn);
                reader = cmd.ExecuteReader();

                while (reader.Read())
                {
                    Funcionalidade func = new Funcionalidade();
                    func.IDFuncionalidade = reader.GetInt32(0);
                    func.Descricao = reader.GetString(1);
                    func.Url = reader.GetString(2);

                    f.Add(func);
                }
            }

            finally
            {
                if (reader != null)
                {
                    reader.Close();
                }

                if (conn != null)
                {
                    conn.Close();
                }
            }

            return f;
        }
    }
}